package leetcode_jz_offer.day21_weiyunsuan;

/**
 * @author 美女
 * @date 2022/07/30 23:55
 **/
public class Num65_不用加减乘除做加法 {
    //通过有无进位区分不同情况（3+2=011+010=101）
    // 无进位时，和异或操作运算规律相同，1^0=1,0^0=0；有进位时，和与运算规律相同,同时与后结果向前左移了一位，1&1=1
    //数字和=无进位和（两数异或）+进位和（两数相与后左移一位）
    //（a^b) ^ ((a&b)<<1) 即：每次无进位数 + 每次得到的进位数--我们需要不断重复这个过程，直到进位数为0为止；
    public int add(int a, int b) {
        int num=(a&b)<<1;//进位和【带括号，不带会有问题】
        int sum=a^b;//无进位的和
        while (num!=0){
            a=sum;
            b=num;
            sum=a^b;
            num=(a&b)<<1;
        }
        return sum;
    }
}
